home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / gnuish / swalibas / sw_lib.c < prev    next >
C/C++ Source or Header  |  1990-09-10  |  4KB  |  180 lines

  1. /* sw_lib.c - respondfiles for the Microsoft librarian.
  2.    Copyright (C) 1990 by Thorsten Ohl, td12@ddagsi3.bitnet
  3.  
  4.    This file is part of SWAPLIB (the library), a library for efficient
  5.    execution of child processes under MS-DOS.
  6.  
  7.    The library is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 1, or (at your option)
  10.    any later version.
  11.  
  12.    The library is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with the library; if not, write to the Free Software
  19.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.    $Header: e:/gnu/swaplib/RCS/sw_lib.c'v 0.9 90/09/09 21:43:58 tho Stable $
  22.  */
  23.  
  24. #include <stdio.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27.  
  28. #include <io.h>
  29.  
  30. #include "swaplib.h"
  31.  
  32.  
  33. /* Build a respondfile for the Microsoft library manager from ARGV.
  34.    We also correct for some lossage in Microsoft's syntax:  A module
  35.    without command  inherits the one of it's predecessor.  This allows
  36.    constructions like `lib foo.lib -+ $?' in makefiles.
  37.    (idea stolen from Kneller's `ndmake').  */
  38.  
  39. int
  40. _swap_build_lib_respond_file (char **argv, char **envv)
  41. {
  42.   FILE *respond_file;
  43.   char *libname;
  44.   char lib_action[3];
  45.   int col = 0;
  46.  
  47.   _swap_respond_file_name = swap_back_slashify (swap_mktmpname ("lb"));
  48.  
  49.   respond_file = fopen (_swap_respond_file_name, "w");
  50.   if (!respond_file)
  51.     {
  52.       int last_errno = errno;
  53.       fprintf (stderr, "can't open lib respond_file: ");
  54.       errno = last_errno;
  55.       perror (_swap_respond_file_name);
  56.       return -1;
  57.     }
  58.  
  59.  
  60.   argv++;
  61.  
  62.   /* Create the first line.  */
  63.  
  64.   /* Handle possible leading options.  */
  65.   while ((*argv)[0] == '/')
  66.     fprintf (respond_file, "%s ", *argv++);
  67.  
  68.   /* The next item *must* be the lib file.  */
  69.   libname = *argv++;
  70.   fprintf (respond_file, "%s ", libname);
  71.  
  72.   /* Handle possible trailing options.  */
  73.   while ((*argv)[0] == '/')
  74.     fprintf (respond_file, "%s ", *argv++);
  75.  
  76.   fprintf (respond_file, "\n");
  77.  
  78.  
  79.   /* We now have to test for the existence of the library, since
  80.      lib wants an additional affirmative `y' if not.  */
  81.  
  82.   if (access (libname, 0))
  83.     {
  84.       /* The library doesn't seem to exist */
  85.  
  86.       char *base = swap_basename (libname);
  87.  
  88.       if (strcmp (base, "lib") != 0)
  89.     {
  90.       /* Try to append the extension ".lib" ... */
  91.  
  92.       char *full_libname = (char *) malloc (strlen (libname) + 5);
  93.       strcat (strcpy (full_libname, libname), ".lib");
  94.  
  95.       if (access (full_libname, 0))
  96.         /* It's really not there: instruct `lib' to create it.  */
  97.         fprintf (respond_file, "y\n");
  98.  
  99.       free (full_libname);
  100.     }
  101.     }
  102.  
  103.  
  104.   /* Default action: replace module.  */
  105.  
  106.   strcpy (lib_action, "-+");
  107.  
  108.  
  109.   /* Loop over the remaining arguments.  */
  110.  
  111.   while (*argv)
  112.     {
  113.       char *p = *argv;
  114.       char *cp;
  115.  
  116.  
  117.       if (*p && strchr ("+-*", *p))
  118.     {
  119.       /* Handle a possible library action.  */
  120.  
  121.       lib_action[0] = *p++;
  122.  
  123.       if (*p && strchr ("+-*", *p))
  124.         lib_action[1] = *p++;
  125.       else
  126.         lib_action[1] = '\0';
  127.  
  128.       /* lib_action[2] is always '\0'. */
  129.     }
  130.  
  131.  
  132.       if (*p)
  133.     {
  134.       /* Handle a module name.  */
  135.  
  136.       if (strlen (p) + col > 50)
  137.         {
  138.           /* Break the line.  */
  139.  
  140.           fprintf (respond_file, "&\n");
  141.           col = 0;
  142.         }
  143.  
  144.       /* Print out the action, but avoid a trailing one.  */
  145.  
  146.       if (!strchr (",;", *p))
  147.         col += fprintf (respond_file, "%s", lib_action);
  148.  
  149.       while (cp = strchr (p, ','))
  150.         {
  151.           /* Break the line at a new group of responses.  */
  152.  
  153.           *cp = '\n';
  154.  
  155.           /* No more line breaks or actions. */
  156.           col = 0;
  157.           lib_action[0] = '\0';
  158.         }
  159.  
  160.       col += fprintf (respond_file, "%s ", p);
  161.     }
  162.  
  163.       argv++;
  164.     }
  165.  
  166.   fprintf (respond_file, "\n\n\n");    /* avoid prompts! */
  167.   fclose (respond_file);
  168.  
  169.   sprintf (_swap_cmdline_buf, "/nologo @%s", _swap_respond_file_name);
  170.   return _swap_format_msdos_environment (NULL, envv, NULL);
  171. }
  172.  
  173. /* 
  174.  * Local Variables:
  175.  * mode:C
  176.  * ChangeLog:ChangeLog
  177.  * compile-command:make
  178.  * End:
  179.  */
  180.